﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MIAP.DataAccess.Implementaciones.SQL;
using MIAP.Entidades;
using MIAP.DataAccess;

namespace MIAP.Negocio.Autenticacion
{
    /// <summary>
    /// Clase de negocio de procesos de autenticación.
    /// </summary>
    public class AutenticacionNegocio
    {
        #region Constants

        /// <summary>
        /// Constante de la excepcion de negocio 'Cuenta de usuario no valida'.
        /// </summary>
        public const string InvalidAccount = "INVALIDACCOUNT";

        /// <summary>
        /// Constante de la excepcion de negocio 'Cuenta de usuario suspendida'.
        /// </summary>
        public const string DisabledAccount = "DISABLEDACCOUNT";

        #endregion

        #region Fields

        /// <summary>
        /// DAO de autenticación.
        /// </summary>
        private readonly  DataAccess.Interfaces.IAutenticacionDao dao;

        #endregion

        #region Constructors

        /// <summary>
        /// Inicializa una nueva instancia de la clase <see cref="AutenticacionNegocio"/>
        /// </summary>
        public AutenticacionNegocio()
        {
            dao= new AutenticacionDao();
        }

        #endregion

        /// <summary>
        /// Comprueba si la credencial de usuario especificada es valida.
        /// </summary>
        /// <param name="nombreUsuario">Nombre de la credencial de usuario.</param>        
        public void ValidateUserAccount(string nombreUsuario)
        {

            // Validar que la credencial de usuario exista.
            bool existCredential = this.dao.ExiststeCredencial(nombreUsuario);
            if (!existCredential)
            {
                throw new Exception(InvalidAccount);
            }

            // Validar que la credencial de usuario se encuentre activa.
            var credencial = this.dao.GetUsuarioCredencial(nombreUsuario);

            if (credencial == null)
            {
                throw new Exception(InvalidAccount);
            }
            else
            {
                bool isUserEnabled = credencial.EstaActivo.HasValue && credencial.EstaActivo.Value;
                if (!isUserEnabled)
                {
                    throw new Exception(DisabledAccount);
                }
            }
        }

        /// <summary>
        /// Obtiene el resumen del usuario asociado a la credencial de usuario especificada.
        /// </summary>
        /// <param name="nombreUsuario">Nombre de usuario de la credencial.</param>
        /// <returns>Una entidad tipo 'UsuarioInfo' conteniendo el resumen del usuario.</returns>
        public UsuarioInfo GetUsuarioByCredential(string nombreUsuario){

            UsuarioInfo result = this.dao.GetUsuarioCredencial(nombreUsuario);
            return result;
        }

        /// <summary>
        /// Obtiene el listado de permisos asociados al usuario especificado.
        /// </summary>
        /// <param name="nombreUsuario">Nombre del usuario apartir del cual se desea obtener los permisos.</param>
        /// <returns>Una lista de entidades tipo 'PermisoInfo' asociadas a los permisos del usuario especificado.</returns>
        public IList<PerfilInfo> GePermissionsByUsuario(int idUsuario)
        {
            return this.dao.GetPerfiles(idUsuario);
        }
    }
}
